using System.Text.RegularExpressions;

namespace CSharpPro._1106;

public class UserServiceImpl : UserService
{
    /*用户登陆与注册*/
    private static List<User> _users = new List<User>();
    bool IsValidUsername(string userName)
    {
        // 正则表达式：3-15个字符，只能包含字母、数字、下划线
        return Regex.IsMatch(userName, @"^[a-zA-Z0-9_]{3,15}$");
    }

    bool IsValidPassword(string password)
    {
        // 验证长度
        if (password.Length < 6 || password.Length > 20)
            return false;

        // 验证是否包含至少1个大写字母、1个小写字母和1个数字
        bool hasUpper = Regex.IsMatch(password, @"[A-Z]");
        bool hasLower = Regex.IsMatch(password, @"[a-z]");
        bool hasNumber = Regex.IsMatch(password, @"[0-9]");

        return hasUpper && hasLower && hasNumber;
    }
    //用户注册
    public void Register(List<User> _users)
    {
        Console.WriteLine("用户注册");
        String username;
        do
        {
            Console.Write("请输入用户名：");
            username = Console.ReadLine();
            if (!IsValidUsername(username))
            {
                Console.WriteLine("用户名不符合格式。");
            }
            else
            {
                break;
            }
        } while (true);
        // 检查用户名是否已存在
        foreach (var user in _users)
        {
            if (user.UserName == username)
            {
                Console.WriteLine("用户名已存在，注册失败！");
            }
        }
        String password;
        do
        {
            Console.Write("请输入密码：");
            password = Console.ReadLine();
            if (!IsValidPassword(password))
            {
                Console.WriteLine("密码不符合输入格式。");
            }
            else
            {
                break;
            }
        }while(true);
        Console.Write("请确认密码：");
        String password2 = Console.ReadLine();
        if (password.Equals(password2)==false)
        {
            Console.WriteLine("密码错误！");
        }
        // 添加用户到泛型集合
        _users.Add(new User(username, password));
        Console.WriteLine("注册成功！");
    }
    //用户登录
    public void Login(List<User> _users)
    {
        Console.WriteLine("用户登录：");
        String username;
        Console.Write("请输入用户名；");
        username = Console.ReadLine();
        String password;
        Console.Write("请输入密码；");
        password = Console.ReadLine();
        foreach (var u in _users)
        { 
            if (u.UserName == username && u.Password.Equals(password)) 
            { 
                Console.WriteLine("登录成功！");
                return;
            } 
        }
        Console.WriteLine("登录失败！");
        return;
    }
    public void ShowAllUsers(List<User> _users)
    {
        if (_users.Count == 0)
        {
            Console.WriteLine("当前没有注册用户！");
            return;
        }

        Console.WriteLine("\n所有注册用户：");
        // foreach循环迭代泛型集合
        foreach (var user in _users)
        {
            Console.WriteLine("用户名："+user.UserName);
        }
    }
    public void DeleteUser(string username,List<User> _users)
    {
        for (int i = 0; i < _users.Count-1; i++)
        {
            if (_users[i].UserName==username)
            {
                //删除指定用户
                _users.RemoveAt(i);
                Console.WriteLine($"用户 {username} 已删除！");
            }
        }
        Console.WriteLine("用户不存在，删除失败！");
    }
    //主菜单交互
    public void Menu()
    { 
        while (true)
        {
            Console.WriteLine("\n===== 用户系统 =====");
            Console.WriteLine("1. 注册");
            Console.WriteLine("2. 登录");
            Console.WriteLine("3. 显示所有用户");
            Console.WriteLine("4. 删除用户");
            Console.WriteLine("5. 退出");
            Console.Write("请选择操作：");
            string choice = Console.ReadLine();

            switch (choice)
            {
                case "1":
                    Register(_users);
                    break;
                case "2":
                    Login(_users);
                    break;
                case "3":
                    ShowAllUsers(_users);
                    break;
                case "4":
                    Console.Write("请输入要删除的用户名：");
                    string delUser = Console.ReadLine();
                    DeleteUser(delUser,_users);
                    break;
                case "5":
                    Console.WriteLine("系统已退出！");
                    return;
                default:
                    Console.WriteLine("无效操作，请重新选择！");
                    break;
            }
        }
    }
}